<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // fon...in :不仅可以遍历私有的属性，原型对象中的属性也可以遍历
    // const arr = [1,2,3,4];
    // Array.prototype.name = 100;
    // for(let key in arr){
    //     console.log(key,arr[key]);
    // }

    // let obj = {
    //     a:1,
    //     b:2,
    //     c:3
    // }
    // Object.prototype.m = 100;
    // for(let key in obj){
    //     console.log(key,obj[key]);
    // }


    // Symbol是不允许被枚举的
    // let obj = {
    //     a:1,
    //     b:2,
    //     c:3,
    //     [Symbol("react.symbol")]:4
    // }
    // for(let key in obj){
    //     console.log(key,obj[key])
    // }

    // 1- 只想遍历自身的实例属性
    // 2- 还想要Symbol属性
    // let obj = {
    //     a:1,
    //     b:2,
    //     c:3,
    //     [Symbol("react.symbol")]:4
    // }
    // Object.prototype.m = 100;
    // // console.log(Object.getOwnPropertyNames(obj));
    // // console.log(Object.getOwnPropertySymbols(obj));
    // const arr = [...Object.getOwnPropertySymbols(obj),...Object.getOwnPropertyNames(obj)];
    // // console.log(arr)
    // arr.forEach(key=>{
    //     console.log(key,obj[key])
    // })

    // let obj = {
    //     a:1,
    //     b:2,
    //     c:3,
    //     [Symbol("react.symbol")]:4
    // }
    // Object.prototype.m = 100;
    // Reflect.ownKeys(obj).forEach(key=>{
    //     console.log(key,obj[key])
    // })

    // 封闭函数,用于遍历对象(1-只获取实例属性 2- 获取到Symbol)
    let obj = {
        a:1,
        b:2,
        c:3,
        [Symbol("react.symbol")]:4
    }
    Object.prototype.m = 100;
    // obj是要遍历的函数,cb回调函数
    // const ownEach = function(obj,cb){
    //     if(typeof obj !== "object") throw new TypeError("obj is not a object");
    //     if(typeof cb !== "function") throw new TypeError("cb is not a function");
    //     Reflect.ownKeys(obj).forEach(key=>{
    //         cb(key,obj[key])
    //     })
    // }
    // ownEach(obj,(key,value)=>{
    //     console.log(key,value);
    // });

    Object.prototype.ownEach = function(cb){
        if(typeof cb !== "function") throw new TypeError("cb is not a function");
        Reflect.ownKeys(this).forEach(key=>{
            cb(key,this[key])
        })
    }
    obj.ownEach(function(key,value){
        console.log(key,value);
    })

</script>
</html>